package com.rutas.java;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Iterator;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;

import android.content.Context;
import android.graphics.drawable.Drawable;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;

import com.google.android.maps.GeoPoint;
import com.google.android.maps.ItemizedOverlay;
import com.google.android.maps.MapView;
import com.google.android.maps.Overlay;

public class Superposicion extends ItemizedOverlay<PuntoOverlayItem>{

	private ArrayList<PuntoOverlayItem> puntos = new ArrayList<PuntoOverlayItem>();
	private Context contexto;
	private MapView mapa;
	private RelativeLayout rlMensaje;	//Asigna para mensaje tipo toast de tab1
	private PuntoOverlayItem lastItemTapped;
	private boolean enableTap;
	//private Toast customToast;
	private Handler pintaRutaHandler = new Handler(){
		@Override
		public void handleMessage(Message msg){		
			
			final ArrayList<GeoPoint> listaPuntos = (ArrayList<GeoPoint>) msg.obj;
			CapaPath camino = new CapaPath(listaPuntos, (int)lastItemTapped.getDist());
			mapa.getOverlays().add(0, camino);	//Insertamos al principio
			mapa.postInvalidate();
			mapa.getController().animateTo(lastItemTapped.getPoint());

			enableTap = true;
		}
	};	
//----------------------------------Funciones necesarias----------------------------------	
	public Superposicion(Drawable defaultMarker, Context c) {
		super(boundCenterBottom(defaultMarker));
		enableTap = true;
		//inicToast();
		contexto = c;
	}
	
	public Superposicion(Drawable defaultMarker, Context c, final ArrayList<PuntoOverlayItem> items, MapView mapaPrincipal, RelativeLayout layout) {
		super(boundCenterBottom(defaultMarker));
		contexto = c;
		this.puntos = items;
		mapa = mapaPrincipal;
		rlMensaje = layout;
		enableTap = true;
		//inicToast();
		populate();
		
	}

	/*public void añadirOverlay(PuntoOverlayItem Item){
		puntos.add(Item);
		populate();
	}*/
	
	public void inicPuntos(){
		if ((puntos != null) && (puntos.size() > 0)){
			for (Iterator<PuntoOverlayItem> i = puntos.iterator(); i.hasNext();){
				i.next();
				i.remove();
			}
		}
	}
	
	private boolean isInAssets(String cadena){

		return !cadena.startsWith("!");
	}
//---------------------------Override----------------------------------------	
	@Override
	protected PuntoOverlayItem createItem(int i) {
		return puntos.get(i);
	}

	@Override
	public int size() {
		return puntos.size();
	}
	
	/*@Override 
	public void draw( Canvas c, MapView m, boolean shadow ) {	//Pinta sin sombra 
		if (shadow) 
			return; 
		super.draw( c, m, shadow ); 
		}*/

	@Override
	protected boolean onTap(int index){
		
		if (enableTap){
			enableTap = false;	//bloquea onTap
			PuntoOverlayItem item = puntos.get(index);
	
			if (lastItemTapped == item)
				lastItemTapped = null;
			
			item.setActivo(!item.esActivo());
			if (lastItemTapped != null)
				lastItemTapped.setActivo(false);
			lastItemTapped = item;
			
			//Si existe al principio CapaPath, la borra
			Iterator<Overlay> iter = mapa.getOverlays().iterator(); 
			if (iter.hasNext()){
				Overlay o = iter.next();
				if (o.getClass().getName().equals(CapaPath.class.getName())){
					iter.remove();	//Elimina el camino del mapa
					rlMensaje.setVisibility(View.GONE);	//Quita el mensaje
				}
			}
			if (item.esActivo() && (!item.getXmlPath().equals(""))){	//pinta ruta
				//Este c�digo hace que lea un XML			
				new Thread(new Runnable(){

					@Override
					public void run() {
						SAXParserFactory spf = SAXParserFactory.newInstance(); 
				        try {
							SAXParser sp = spf.newSAXParser();
							XMLReader xr = sp.getXMLReader();
							Message mensaje = new Message();
							
							String xmlPath = lastItemTapped.getXmlPath();
							String filenameArray[] = xmlPath.split("\\.");
					        String extension = filenameArray[filenameArray.length-1];
					        InputStream myInput;
					        if (!isInAssets(xmlPath)){
					        	//File f = new File(Environment.getExternalStorageDirectory()+"/rutas/"+ xmlPath);
					        	File f = new File("/data/data/com.rutas.java/files/", xmlPath);
					        	myInput = new FileInputStream(f);
					        }
					        else
					        	myInput = contexto.getAssets().open(xmlPath);
					        
							InputSource archivo = new InputSource(myInput);
							archivo.setEncoding("UTF-8");
							
					        if (extension.toLowerCase().contentEquals("kml")){
								KmlHandler kml = new KmlHandler();
								xr.setContentHandler(kml);	
								xr.parse(archivo);
								mensaje.obj = kml.getPath();
					        }else{
					        	GpxHandler gpx = new GpxHandler(true);
					        	xr.setContentHandler(gpx);
								xr.parse(archivo);
								mensaje.obj = gpx.getPath();
					        }
							pintaRutaHandler.sendMessage(mensaje);
							myInput.close();
				        } catch (ParserConfigurationException e) {
							Log.d("Superposicion/OnTap/Parser ", e.toString());
							e.printStackTrace();
							enableTap = true;
						} catch (SAXException e) {
							Log.d("Superposicion/OnTap/SAX ", e.toString());
							e.printStackTrace();
							enableTap = true;
						} catch (IOException e) {
							Log.d("Superposicion/OnTap/InputStream ", e.toString());
							e.printStackTrace();
							enableTap = true;
						}
					}				
				}).start();	
				
				int bandera;
				if (lastItemTapped.getDist() >= 50){
					bandera = R.drawable.flag_red_32;
				}else if (lastItemTapped.getDist() <= 10){
					bandera = R.drawable.flag_green_32;
				}else
					bandera = R.drawable.flag_yellow_32;
				
				//Mensaje visible
				rlMensaje.setTag(lastItemTapped.getPoint());
				ImageView imagen = (ImageView)rlMensaje.getChildAt(0);
				imagen.setImageResource(bandera);
				TextView texto1 = (TextView) rlMensaje.getChildAt(1);
				texto1.setText(lastItemTapped.getTitle());
				TextView texto2 = (TextView) rlMensaje.getChildAt(3);
				texto2.setText(lastItemTapped.getDist() + " km"  + " | " + lastItemTapped.getSnippet());
				rlMensaje.setVisibility(View.VISIBLE);
			}else{
				enableTap = true;	//reactiva onTap
				mapa.postInvalidate();
			}
		}
		return true;
	}
}
